/**
* Copyright (C) 2021 All rights reserved.
*
* @file main.h
* @author Wang Haibin
* @email wanghaibin@qiyi.com
* @date Sun Apr 27 14:07:18 CST 2025
* @brief  每次获取数据位上最后一个1标记位上的数值，并设置此位上的数据为0
*/

#include <iostream>

class BitMarker {
private:
    unsigned int marker;

public:
    BitMarker(unsigned int initial_marker) : marker(initial_marker) {}

    // 返回最后一个1的位置（从右到左，最低位为1），并清除该位
    // 如果没有1了，返回0
    int get_next() {
        if (marker == 0) {
            return 0; // 所有位已经处理完
        }
        // 获取最低位的1的位置（如 11011011 & -11011011 = 00000001 → 1）
        int pos = marker & -marker;
        // 清除最低位的1（11011011 & 11011010 = 11011010）
        marker &= marker - 1;
        // 返回位置（如 1 → 1, 10 → 2, 100 → 4, etc.）
        return pos;
    }

	// 使用 x & -x 快速找到最低位的1，返回1所在的位置(从0开始)
	int get_next_pos() {
		if (marker == 0) return -1;
		// 计算最低位的1的位置
		int mask = marker & -marker; // 获取最低位的1（如 0b11011000 → 0b00001000）
		int pos = 0; // (从0开始)
		printf("mask=%d, m=%d\n", mask, marker);
		// 右移mask直到为1，统计移位次数得到pos
		while (mask >>= 1) {
			++pos;
		}

		// 清除该位的1
		marker &= marker-1;
		return pos;
	}
};

int main() {
    BitMarker bm(0b11011011); // 219 in decimal

    // 测试调用 get_next()
    std::cout << bm.get_next_pos() << std::endl; // 1 (00000001)
    std::cout << bm.get_next_pos() << std::endl; // 2 (00000010)
    std::cout << bm.get_next_pos() << std::endl; // 8 (00001000)
    std::cout << bm.get_next_pos() << std::endl; // 16 (00010000)
    std::cout << bm.get_next_pos() << std::endl; // 32 (00100000)
    std::cout << bm.get_next_pos() << std::endl; // 64 (01000000)
    std::cout << bm.get_next_pos() << std::endl; // 128 (10000000)
    std::cout << bm.get_next_pos() << std::endl; // 0 (no more 1s)

    return 0;
}
